/**
 * Alipay.com Inc.
 * Copyright (c) 2004-2022 All Rights Reserved.
 */
package com.example.spider.proxy.provider.ip66;

import cn.hutool.core.util.ReUtil;
import com.example.spider.proxy.core.ProxyInfo;
import com.example.spider.proxy.core.tester.ProxyTypeEnum;
import com.example.spider.proxy.provider.AbstractProxyResultHandler;
import com.example.spider.proxy.provider.IpProxySpiderTask;
import com.example.spider.starter.SpiderStarter;
import com.example.spider.task.SpiderTaskQueue;
import org.shoulder.core.converter.LocalDateTimeConverter;

import java.nio.charset.Charset;
import java.time.Duration;
import java.util.List;

/**
 * http://www.66ip.cn/index.html
 * 每两小时更新一次，支持按照地区抓，但是数据较多，建议抓前面的，只抓近几个月的
 * <p>
 * 目前一次生成1-最后一页，翻页功能克以完善：动态判断个数
 *
 * @author lym
 */
//@Component
public class Ip66ResultHandler extends AbstractProxyResultHandler implements SpiderStarter {

    public Ip66ResultHandler() {
        super("ip66");
    }


    /**
     * 网站没有限速，响应贼快
     */
    protected Duration defaultLimitRateDuration() {
        return Duration.ofMillis(20);
    }

    protected IpProxySpiderTask customizeTask(IpProxySpiderTask task) {
        task.setCharset(Charset.forName("gb2312"));
        return task;
    }

    @Override
    public void startSpiders() {
        // 不限地区
        IpProxySpiderTask task = createTask("http://www.66ip.cn/index.html");
        SpiderTaskQueue.putTask(task);

        // 不限地区-前x页
        String urlTemplate = "http://www.66ip.cn/%d.html";
        for (int i = 2; i <= 3030; i++) {
            IpProxySpiderTask pageTask = createTask(String.format(urlTemplate, i));
            SpiderTaskQueue.putTask(pageTask);
        }

        // 特定地区，只爬每个地区第一页
//        String areaProxyUrlTemplate = "http://www.66ip.cn/areaindex_%d/1.html";
//        for (int i = 1; i <= 34; i++) {
//            String areaProxyUrl = String.format(areaProxyUrlTemplate, i);
//            IpProxySpiderTask areaTask = createTask(areaProxyUrl);
//            SpiderTaskQueue.putTask(areaTask);
//        }
    }

    /**
     * 每 30 分钟触发一次
     */
    @Override
    public String executeCron() {
        return "0 0/30 * * * ?";
    }

    /**
     * ip	端口号	代理位置	代理类型	验证时间
     * 36.80.36.57	46210	印度尼西亚	高匿代理	2021年09月15日22时 验证
     */
    @Override
    public void doHandle(IpProxySpiderTask task, String html) {

        String regex = "<tr>" +
                "<td>(.*?)</td>" +
                "<td>(.*?)</td><td>(.*?)</td>" +
                "<td>(.*?)</td>" +
                "<td>(.*?)</td>" +
                "</tr>";

        List<String> ipList = ReUtil.findAll(regex, html, 1);
        List<String> portList = ReUtil.findAll(regex, html, 2);
        List<String> locationList = ReUtil.findAll(regex, html, 3);
        List<String> anonymityList = ReUtil.findAll(regex, html, 4);
        List<String> lastVerificationTimeList = ReUtil.findAll(regex, html, 5);

        for (int i = 1; i < ipList.size(); i++) {
            String lastVerificationTime = lastVerificationTimeList.get(i).replace(" 验证", "").replace("年", "-").replace("月", "-").replace("日", " ").replace("时", ":00:00");
            ProxyInfo proxyInfo = ProxyInfo.builder()
                    .source(taskName)
                    .ip(ipList.get(i))
                    .port(Integer.parseInt(portList.get(i)))
                    .proxyTypeEnum(ProxyTypeEnum.UNKNOWN)
                    .type(ProxyTypeEnum.UNKNOWN.getType())
                    .anonymity(anonymityList.get(i).replace("代理", ""))
                    .location(locationList.get(i))
                    .lastVerificationTime(LocalDateTimeConverter.INSTANCE.convert(lastVerificationTime))
                    .build();

            addProxyToSourceRepository(proxyInfo);
        }
    }

}